package com.edu.employee.controller;

import com.edu.commons.*;
import com.edu.employee.pojo.dto.EmpInfoDTO;
import com.edu.employee.pojo.dto.EmpLoginDTO;
import com.edu.employee.pojo.dto.EmpQueryDTO;
import com.edu.employee.pojo.dto.EmpUpdatePwdDTO;
import com.edu.employee.pojo.entity.Certificates;
import com.edu.employee.pojo.entity.EmpStatus;
import com.edu.employee.pojo.entity.Marriage;
import com.edu.employee.pojo.entity.MinZu;
import com.edu.employee.pojo.vo.EmpInfoUpdateVO;
import com.edu.employee.pojo.vo.EmpInfoVO;
import com.edu.employee.pojo.vo.EmpListVO;
import com.edu.employee.pojo.vo.EmpLoginVO;
import com.edu.employee.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @ProjectName: summer-project
 * @Titile: EmpController
 * @Author: Lucky
 * @Description: 员工控制类
 */
@RestController
@RequestMapping("/api/emp")
@Slf4j
public class EmpController {
    //注入业务层对象
    @Autowired
    private EmpService empService;

    @PostMapping("login")
    public R<EmpLoginVO> login(@Validated EmpLoginDTO empLoginDTO) {
        log.debug("员工的登录信息:{}", empLoginDTO);
        //调用员工业务对象
        EmpLoginVO empLoginVO = empService.login(empLoginDTO);
        return R.ok("登录成功", empLoginVO);//如果业务层对象的处理登录业务的方法没报错，就可以返回数据
    }

    /**
     * 修改密码
     * @param updatePwdDTO 修改的密码数据
     * @param request 请求中带有的修改人
     * @return 返回修改的结果
     */
    //@RequestMapping(value = "updatePwd",method = RequestMethod.PUT)
    @PutMapping("updatePwd")
    public R<Void> updatePwd(@Validated EmpUpdatePwdDTO updatePwdDTO, HttpServletRequest request){
        log.debug("修改的密码数据:{}",updatePwdDTO);
        //获取token
        String token = request.getHeader(Constants.TOKEN_HEADER_KEY);
        //获取登录的员工
        EmpVO empVO = JWTUtils.parseToken(token);
        //调用业务层方法
        empService.updatePwd(updatePwdDTO,empVO);
        return R.ok("修改密码成功");
    }

    /**
     * 查询员工个人信息
     * @param request 请求
     * @return 个人信息
     */
    @GetMapping("info")
    public R<EmpInfoVO> getEmpInfo(HttpServletRequest request){
        log.debug("---查询员工个人信息---");
        //获取token
        String token = request.getHeader(Constants.TOKEN_HEADER_KEY);
        //获取登录的员工
        EmpVO empVO = JWTUtils.parseToken(token);
        //调用业务层对象查询员工的个人信息
        EmpInfoVO empInfoVO =  empService.getEmpInfo(empVO);
        return R.ok("查询员工的个人信息成功",empInfoVO);
    }

    /**
     * 查询证件类型列表
     * @return 证件类型列表
     */
    @GetMapping("typeList")
    public R<List<Certificates>> getTypeList(){
       List<Certificates> typeList =  empService.getTypeList();
       return R.ok("查询证件类型列表成功",typeList);
    }
    /**
     * 查询民族列表
     * @return 民族列表
     */
    @GetMapping("minZuList")
    public R<List<MinZu>> getMinZuList(){
        List<MinZu> minZuList =  empService.getMinZuList();
        return R.ok("查询民族列表成功",minZuList);
    }

    /**
     * 查询婚姻状况列表
     * @return 婚姻状况列表
     */
    @GetMapping("marriageList")
    public R<List<Marriage>> getMarriageList(){
        List<Marriage> marriageList =  empService.getMarriageList();
        return R.ok("查询婚姻状况列表成功",marriageList);
    }
    /**
     * 查询员工状态列表
     * @return 员工状态列表
     */
    @GetMapping("statusList")
    public R<List<EmpStatus>> getStatusList(){
        List<EmpStatus> empStatusList =  empService.getEmpStatusList();
        return R.ok("查询员工状态列表成功",empStatusList);
    }

    /**
     * 修改个人信息
     * @param empInfoDTO 修改的数据
     * @param request 修改人
     * @return 修改成功后：员工名称+头像地址
     */
    @PutMapping("info")
    public R<EmpInfoUpdateVO> updateEmpInfo(@Validated EmpInfoDTO empInfoDTO,HttpServletRequest request){
        log.debug("获取修改个人信息:{}",empInfoDTO);
        //获取token
        String token = request.getHeader(Constants.TOKEN_HEADER_KEY);
        //获取员工
        EmpVO empVO = JWTUtils.parseToken(token);
        EmpInfoUpdateVO empInfoUpdateVO = empService.updateEmpInfo(empInfoDTO,empVO);
        return R.ok("修改个人信息成功",empInfoUpdateVO);
    }

    /**
     * 分页+组合条件查询员工列表
     * @param empQueryDTO 茶轩条件
     * @return 分页数据
     */
    @GetMapping("list")
    public R<PageVO<EmpListVO>> getEmpList(EmpQueryDTO empQueryDTO){
        log.debug("分页+组合查询的条件:{}",empQueryDTO);
        PageVO<EmpListVO> pageVO = empService.getEmpList(empQueryDTO);
        return R.ok("查询员工列表成功",pageVO);
    }

}
